/**
 * 定位工具类
 * 统一管理定位相关功能
 */

/**
 * 获取当前位置
 * @param {Object} options 配置选项
 * @returns {Promise} 返回位置信息
 */
export function getCurrentLocation(options = {}) {
	return new Promise((resolve, reject) => {
		const {
			type = 'gcj02', // 坐标类型：wgs84, gcj02, bd09
			altitude = true, // 是否返回高度信息
			geocode = true, // 是否自动解析地址信息
			timeout = 10000, // 超时时间（毫秒）
			showLoading = true, // 是否显示加载提示
			loadingTitle = '定位中...' // 加载提示文字
		} = options;

		if (showLoading) {
			uni.showLoading({
				title: loadingTitle,
				mask: true
			});
		}

		uni.getLocation({
			type: type,
			altitude: altitude,
			geocode: geocode,
			success: (res) => {
				if (showLoading) {
					uni.hideLoading();
				}
				resolve({
					success: true,
					latitude: res.latitude,
					longitude: res.longitude,
					altitude: res.altitude || 0,
					accuracy: res.accuracy || 0,
					address: res.address || '',
					province: res.province || '',
					city: res.city || '',
					district: res.district || '',
					street: res.street || '',
					streetNumber: res.streetNumber || ''
				});
			},
			fail: (err) => {
				if (showLoading) {
					uni.hideLoading();
				}
				reject({
					success: false,
					error: err.errMsg || '定位失败',
					code: err.errCode || -1
				});
			}
		});
	});
}

/**
 * 选择位置（打开地图选择）
 * @returns {Promise} 返回选择的位置信息
 */
export function chooseLocation() {
	return new Promise((resolve, reject) => {
		uni.chooseLocation({
			success: (res) => {
				resolve({
					success: true,
					name: res.name,
					address: res.address,
					latitude: res.latitude,
					longitude: res.longitude
				});
			},
			fail: (err) => {
				reject({
					success: false,
					error: err.errMsg || '选择位置失败',
					code: err.errCode || -1
				});
			}
		});
	});
}

/**
 * 打开地图查看位置
 * @param {Object} location 位置信息
 * @param {Number} location.latitude 纬度
 * @param {Number} location.longitude 经度
 * @param {String} location.name 位置名称
 * @param {String} location.address 详细地址
 */
export function openLocation(location) {
	const {
		latitude,
		longitude,
		name = '位置',
		address = ''
	} = location;

	uni.openLocation({
		latitude: latitude,
		longitude: longitude,
		name: name,
		address: address,
		scale: 18,
		success: () => {
			console.log('打开地图成功');
		},
		fail: (err) => {
			console.error('打开地图失败', err);
			uni.showToast({
				title: '打开地图失败',
				icon: 'none'
			});
		}
	});
}

/**
 * 计算两点之间的距离（米）
 * @param {Number} lat1 起点纬度
 * @param {Number} lng1 起点经度
 * @param {Number} lat2 终点纬度
 * @param {Number} lng2 终点经度
 * @returns {Number} 距离（米）
 */
export function getDistance(lat1, lng1, lat2, lng2) {
	const R = 6371000; // 地球半径（米）
	const dLat = (lat2 - lat1) * Math.PI / 180;
	const dLng = (lng2 - lng1) * Math.PI / 180;
	const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
		Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
		Math.sin(dLng / 2) * Math.sin(dLng / 2);
	const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
	return R * c;
}

/**
 * 格式化距离显示
 * @param {Number} distance 距离（米）
 * @returns {String} 格式化后的距离字符串
 */
export function formatDistance(distance) {
	if (distance < 1000) {
		return Math.round(distance) + 'm';
	} else {
		return (distance / 1000).toFixed(1) + 'km';
	}
}

/**
 * 检查定位权限
 * @returns {Promise} 返回权限状态
 */
export function checkLocationPermission() {
	return new Promise((resolve) => {
		// #ifdef APP-PLUS
		plus.geolocation.getCurrentPosition(
			() => {
				resolve({ hasPermission: true });
			},
			(err) => {
				resolve({ hasPermission: false, error: err.message });
			}
		);
		// #endif
		
		// #ifdef MP-WEIXIN
		uni.getSetting({
			success: (res) => {
				const hasPermission = res.authSetting['scope.userLocation'] !== false;
				resolve({ hasPermission: hasPermission });
			},
			fail: () => {
				resolve({ hasPermission: false });
			}
		});
		// #endif
		
		// #ifdef H5
		if (navigator.geolocation) {
			navigator.geolocation.getCurrentPosition(
				() => resolve({ hasPermission: true }),
				() => resolve({ hasPermission: false })
			);
		} else {
			resolve({ hasPermission: false, error: '浏览器不支持定位' });
		}
		// #endif
	});
}

/**
 * 请求定位权限
 * @returns {Promise} 返回权限请求结果
 */
export function requestLocationPermission() {
	return new Promise((resolve) => {
		// #ifdef APP-PLUS
		plus.geolocation.getCurrentPosition(
			() => {
				resolve({ granted: true });
			},
			(err) => {
				resolve({ granted: false, error: err.message });
			}
		);
		// #endif
		
		// #ifdef MP-WEIXIN
		uni.authorize({
			scope: 'scope.userLocation',
			success: () => {
				resolve({ granted: true });
			},
			fail: () => {
				resolve({ granted: false, error: '用户拒绝授权' });
			}
		});
		// #endif
		
		// #ifdef H5
		if (navigator.geolocation) {
			navigator.geolocation.getCurrentPosition(
				() => resolve({ granted: true }),
				() => resolve({ granted: false, error: '用户拒绝授权' })
			);
		} else {
			resolve({ granted: false, error: '浏览器不支持定位' });
		}
		// #endif
	});
}

